{ "cells": [ { "cell_type": "markdown", "id": "b1e0bbf3", "metadata": {}, "source": [ "# Reinforcement learning" ] }, { "cell_type": "markdown", "id": "58b57fee", "metadata": {}, "source": [ "## Goal and perspectives\n", "\n", "This tutorial is mainly adapted from this article https://arxiv.org/pdf/2103.06294.pdf and inspired by the work done during the 2022 LOQCathon." ] }, { "attachments": {}, "cell_type": "markdown", "id": "8078725c", "metadata": {}, "source": [ "### Reinforcement learning\n", "\n", "Reinforcement learning is a machine learning framework where an agent tries to find the right actions to perform by interacting with an environment. This is modelled by an agent who is taking actions and receiving percepts from the environment which can be used to choose the next actions. At the end of an epoch (or a series of epochs), the environment rewards (or not) the agent according to the string of actions taken. From the reward, the agent learns and adapts their strategy for the next epochs.\n", "\n", "![reinforcement_learning.png](../_static/img/reinforcement-learning_reinforcement_learning.png)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "5a7f63da", "metadata": {}, "source": [ "In Quantum Reinforcement learning, the exchanged actions, percepts and rewards are now quantum states being exchanged between the environment and the agent. In their paper, the authors claimed to have found a quantum advantage in the time for training by making use of Grover's amplification method to reach good actions quicker, and the goal of this tutorial is to reproduce the main results of their paper:\n", "\n", "![results_paper.png](../_static/img/reinforcement-learning_results_paper.png)\n" ] }, { "cell_type": "markdown", "id": "4f74c3b5", "metadata": {}, "source": [ "## Imports of packages and configuration of display" ] }, { "cell_type": "code", "execution_count": 1, "id": "7085c79d", "metadata": {}, "outputs": [], "source": [ "from typing import Union\n", "\n", "from ipywidgets import FloatProgress\n", "from IPython.display import display\n", "\n", "import perceval as pcvl\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from perceval.components.unitary_components import Unitary, BS, PS\n", "from perceval.rendering.circuit import DisplayConfig, SymbSkin\n", "\n", "DisplayConfig.select_skin(SymbSkin)" ] }, { "cell_type": "markdown", "id": "edc77d36", "metadata": {}, "source": [ "## Grover's algorithm" ] }, { "cell_type": "markdown", "id": "c50e3403", "metadata": {}, "source": [ "We will now implement Grover's algorithm, firstly from a high-level picture (using unitaries) and then photonically (using Mach-Zehnder interferometers) in the same way that was done in the article." ] }, { "cell_type": "markdown", "id": "e89e9be7", "metadata": {}, "source": [ "### Grover's algorithm in high-level picture" ] }, { "cell_type": "code", "execution_count": 2, "id": "83faf254", "metadata": {}, "outputs": [], "source": [ "# Let's create a function that generates our circuit, given an angle xi\n", "\n", "def grover_circuit_unitaries(xi:float) -> pcvl.Circuit:\n", " # Unitary to go from |00> to cos(xi)|10> + sin(xi)|01>\n", " unitary_p = pcvl.Matrix(\n", " np.array([[np.cos(xi), -np.sin(xi)], [np.sin(xi), np.cos(xi)]])\n", " )\n", " # Unitary for Hadamard gate\n", " unitary_hadamard = pcvl.Matrix(1 / np.sqrt(2) * np.array([[1, 1], [1, -1]]))\n", " # Unitary for environment interaction, that switches the phase of the good state\n", " unitary_env = pcvl.Matrix(np.array([[0, -1], [-1, 0]]))\n", " # Unitary of the reflection\n", " unitary_reflection = pcvl.Matrix(\n", " np.array(\n", " [\n", " [np.cos(2 * xi), np.sin(2 * xi)],\n", " [np.sin(2 * xi), -np.cos(2 * xi)],\n", " ]\n", " )\n", " )\n", " \n", " # We can now assemble our circuit\n", " hadamard_component = Unitary(unitary_hadamard, \"H\")\n", " circuit = pcvl.Circuit(4) // (1, Unitary(unitary_p, \"P\")) // (0, hadamard_component) // (2, hadamard_component) // (2, Unitary(unitary_env, \"env\"))\\\n", " // (0, hadamard_component) // (2, hadamard_component) // (1, Unitary(unitary_reflection, \"reflection\"))\n", " return circuit" ] }, { "cell_type": "code", "execution_count": 3, "id": "94b60295", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "P\n", "\n", "\n", "\n", "\n", "H\n", "\n", "\n", "\n", "\n", "H\n", "\n", "\n", "\n", "env\n", "\n", "\n", "\n", "H\n", "\n", "\n", "\n", "H\n", "\n", "\n", "\n", "\n", "reflection\n", "\n", "\n", "\n", "\n", "\n", "\n", "0\n", "1\n", "2\n", "3\n", "0\n", "1\n", "2\n", "3\n", "" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pcvl.pdisplay(grover_circuit_unitaries(np.pi/3))" ] }, { "cell_type": "markdown", "id": "01ddb6f0", "metadata": {}, "source": [ "One step of amplitude amplification in Grover's algorithm should rotate our state from a $\\xi$ angle to a $3\\xi$ angle from the loosing state to the winning state. Hence we can check the validity of our Grover's amplification algorithm by inputting a photon in the spatial mode 1 and detecting at spatial mode 2. This should follow a $\\sin(3\\xi)^2$ distribution." ] }, { "cell_type": "code", "execution_count": 4, "id": "d1f06163", "metadata": {}, "outputs": [], "source": [ "xis = np.linspace(0, np.pi/2, 100)\n", "results = []\n", "for xi in xis:\n", " circuit = grover_circuit_unitaries(xi)\n", " backend = pcvl.BackendFactory.get_backend()\n", " backend.set_circuit(circuit)\n", " input_state = pcvl.BasicState([0, 1, 0, 0])\n", " backend.set_input_state(input_state)\n", " results.append(backend.probability(pcvl.BasicState([0, 0, 1, 0])))" ] }, { "cell_type": "code", "execution_count": 5, "id": "09fc599f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(xis, results, \"-o\", label=\"Simulation\")\n", "plt.plot(xis, np.sin((3*xis)) ** 2, \"--\", label=\"Theoritical\")\n", "plt.title(\"Probability after Grover's amplification\")\n", "plt.xlabel(\"$\\\\xi$\")\n", "plt.ylabel(\"Probability\")\n", "plt.grid()\n", "plt.legend()" ] }, { "cell_type": "markdown", "id": "4ebd4183", "metadata": {}, "source": [ "### Designing the circuit with Mach-Zehnder interferometers" ] }, { "attachments": {}, "cell_type": "markdown", "id": "a46700fb", "metadata": {}, "source": [ "In the article they have used Mach-Zehnder interferometers (see below) to realize all the circuits.\n", "\n", "![mzi.png](../_static/img/reinforcement-learning_mzi.png)\n", "\n", "\n", "We want to perform the following unitary transformation (equation A.19 in the paper)\n", "\n", "$$U_{\\theta,\\varphi} = \\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix}$$\n", "\n", "However taking the MZI as shown and using the Rx convention for beam splitters yields the following matrix (see documentation [here](https://perceval.quandela.net/docs/components.html#beam-splitter)).\n", "\n", "\n", "$$ie^{i\\frac{\\theta}{2}}\\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix}$$\n", "\n", "To remove this global phase effect, we use phase shifters with angle $\\theta_2$ to be $-\\frac \\pi 2 - \\frac \\theta 2$:" ] }, { "cell_type": "code", "execution_count": 6, "id": "9cc0419f", "metadata": {}, "outputs": [], "source": [ "def mzi(name:str, theta:Union[float, pcvl.Parameter], phi:Union[float, pcvl.Parameter],theta_2:Union[float, pcvl.Parameter]) -> pcvl.Circuit:\n", " # For the mzi to be in the right shape:\n", " # theta_2 should be set to '- pi/2 - theta/2'\n", " # however we cannot pass a symbolic expression to the input of PS\n", " # so we need to define a third angle theta_2 that we will set to '- pi/2 - theta/2' later on\n", " return (\n", " pcvl.Circuit(2, name=name)\n", " .add(0, BS())\n", " .add(0, PS(theta))\n", " .add(0, BS())\n", " .add(0, PS(phi))\n", " .add(0, PS(theta_2))\n", " .add(1, PS(theta_2))\n", " )\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "79a8d2a1", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=theta_t\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=phi_t\n", "\n", "\n", "Φ=theta_2\n", "\n", "\n", "Φ=theta_2\n", "\n", "\n", "\n", "0\n", "1\n", "0\n", "1\n", "" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "theta_t = pcvl.P(\"theta_t\")\n", "phi_t = pcvl.P(\"phi_t\")\n", "theta_2 = pcvl.P(\"theta_2\")\n", "\n", "pcvl.pdisplay(mzi(\"test\", theta_t, phi_t, theta_2))" ] }, { "cell_type": "markdown", "id": "8f282446", "metadata": {}, "source": [ "#### Implementing the gates with MZI" ] }, { "cell_type": "markdown", "id": "1227b4b9", "metadata": {}, "source": [ "##### Hadamard\n", "\n", "For the Hadamard, we want $\\theta$ and $\\varphi$ such that\n", "\n", "$$\\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix} = \\frac{1}{\\sqrt{2}}\\begin{pmatrix}1 & 1\\\\ 1 & -1 \\end{pmatrix}$$\n", "\n", "so we set $\\theta = \\frac{\\pi}{2}$ and $\\varphi = 0$." ] }, { "cell_type": "code", "execution_count": 8, "id": "5edc592f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "$\\left[\\begin{matrix}0.707106781186547 - 1.11022302462516 \\cdot 10^{-16} i & \\frac{i \\left(-3.33066907387547 \\cdot 10^{-16} - 1.4142135623731 i\\right)}{2}\\\\\\frac{i \\left(-3.33066907387547 \\cdot 10^{-16} - 1.4142135623731 i\\right)}{2} & -0.707106781186547 + 1.11022302462516 \\cdot 10^{-16} i\\end{matrix}\\right]$" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "hadamard = mzi(\"H\", np.pi/2, 0, -np.pi/2 - np.pi/4)\n", "\n", "pcvl.pdisplay(hadamard.U)" ] }, { "cell_type": "markdown", "id": "a5ce938e", "metadata": {}, "source": [ "##### Environnement\n", "For the environnement, we want a matrix of the form\n", "\n", "$$\\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix} = \\begin{pmatrix}0 & -1\\\\ -1 & 0 \\end{pmatrix}$$\n", "\n", "which gives $\\theta = -2\\pi$ and $\\varphi=0$." ] }, { "cell_type": "code", "execution_count": 9, "id": "5a76c917", "metadata": {}, "outputs": [ { "data": { "text/html": [ "$\\left[\\begin{matrix}1.22464679914735 \\cdot 10^{-16} & \\frac{i \\left(3.67394039744206 \\cdot 10^{-16} + 2.0 i\\right)}{2}\\\\\\frac{i \\left(3.67394039744206 \\cdot 10^{-16} + 2.0 i\\right)}{2} & -1.22464679914735 \\cdot 10^{-16}\\end{matrix}\\right]$" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "env = mzi(\"U_E\", -2 * np.pi, 0, -np.pi/2 + np.pi)\n", "\n", "pcvl.pdisplay(env.U)" ] }, { "cell_type": "markdown", "id": "5c740108", "metadata": {}, "source": [ "##### Preparation of state\n", "\n", "For the preparation of the state, we want a matrix of the form\n", "\n", "\n", "$$\\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix} = \\begin{pmatrix}\\cos(\\xi) & -\\sin(\\xi)\\\\ \\sin(\\xi) & \\cos(\\xi) \\end{pmatrix}$$\n", "\n", "which gives $\\theta = \\pi - 2\\xi$ and $\\varphi=0$.\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "30243876", "metadata": {}, "outputs": [], "source": [ "theta_prep = pcvl.P(\"theta_prep\") # We will set it to pi - 2*xi later\n", "theta2_prep = pcvl.P(\"theta2_prep\") # We will set it to -pi/2 - pi/2 + xi = -pi + xi later as we cannot pass symbolic expression to the function mzi\n", "state_prep = mzi(\"U_p\", theta_prep, 0, theta2_prep)" ] }, { "cell_type": "markdown", "id": "6905688f", "metadata": {}, "source": [ "##### Reflection\n", "\n", "For the reflection, we want a matrix of the form \n", "\n", "$$\\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix} = \\begin{pmatrix}\\cos(2\\xi) & \\sin(2\\xi)\\\\ \\sin(2\\xi) & -\\cos(2\\xi) \\end{pmatrix}$$\n", "\n", "which gives $\\theta = \\pi - 4\\xi$ and $\\varphi=0$" ] }, { "cell_type": "code", "execution_count": 11, "id": "a640d216", "metadata": {}, "outputs": [], "source": [ "theta_ref = pcvl.P(\"theta_ref\") # We will set it to pi - 4*xi later\n", "theta2_ref = pcvl.P(\"theta2_ref\") # We will set it to -pi/2 - pi/2 + 2xi = -pi + 2xi later as we cannot pass symbolic expression to the function mzi\n", "ref = mzi(\"U_ref\", theta_ref, 0, theta2_ref)" ] }, { "cell_type": "markdown", "id": "f0e532b8", "metadata": {}, "source": [ "### Grover's algorithm with MZI" ] }, { "cell_type": "markdown", "id": "3acb6e44", "metadata": {}, "source": [ "We now implement again Grover's algorithm with MZI implementation as a sanity check for the definitions of the gates we chose." ] }, { "cell_type": "code", "execution_count": 12, "id": "5029c0f7", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "U_P\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=theta_prep\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=theta2_prep\n", "\n", "\n", "Φ=theta2_prep\n", "\n", "\n", "\n", "H\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "\n", "H\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "U_E\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=2*pi\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "H\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "H\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "\n", "U_REF\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=theta_ref\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=theta2_ref\n", "\n", "\n", "Φ=theta2_ref\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "0\n", "1\n", "2\n", "3\n", "0\n", "1\n", "2\n", "3\n", "" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "circuit = pcvl.Circuit(4)\n", "circuit.add(1, state_prep).add(0, hadamard).add(2, hadamard).add(2, env).add(0, hadamard).add(2, hadamard).add(1, ref)\n", "\n", "pcvl.pdisplay(circuit, recursive=True)" ] }, { "cell_type": "code", "execution_count": 13, "id": "3d002e05", "metadata": {}, "outputs": [], "source": [ "results_mzis = []\n", "\n", "for xi in xis:\n", " # Update values in the circuit\n", " theta1 = np.pi - 2*xi #set the angle as explained above in 'Preparation of state'\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " \n", " theta2 = np.pi - 4*xi #set the angle as explained above in 'Reflection'\n", " theta_ref.set_value(theta2)\n", " theta2_ref.set_value(-np.pi/2 - theta2/2)\n", " \n", " backend = pcvl.BackendFactory.get_backend()\n", " backend.set_circuit(circuit)\n", " input_state = pcvl.BasicState([0, 1, 0, 0])\n", " backend.set_input_state(input_state)\n", " results_mzis.append(backend.probability(pcvl.BasicState([0, 0, 1, 0])))" ] }, { "cell_type": "code", "execution_count": 14, "id": "68692596", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(xis, results, \"-o\", label=\"Simulation (Unitaries)\")\n", "plt.plot(xis, results_mzis, \"-o\", label=\"Simulation (MZIs)\")\n", "plt.plot(xis, np.sin((3*xis)) ** 2, \"--\", label=\"Theoritical\")\n", "plt.title(\"Probability after Grover's amplification\")\n", "plt.xlabel(\"$\\\\xi$\")\n", "plt.ylabel(\"Probability\")\n", "plt.grid()\n", "plt.legend()" ] }, { "cell_type": "markdown", "id": "f746dd6f", "metadata": {}, "source": [ "## Reproducing the results of the paper" ] }, { "cell_type": "markdown", "id": "630086db", "metadata": {}, "source": [ "### Classical circuit" ] }, { "attachments": {}, "cell_type": "markdown", "id": "8e07dd70", "metadata": {}, "source": [ "The classical circuit emulates the agent choosing a good action with probability $\\varepsilon = \\sin^2(\\xi)$. To this end, the operation $U_p |0_A0_R\\rangle = \\cos(\\xi)|0_A0_R\\rangle + \\sin(\\xi)|1_A0_R\\rangle$ is implemented putting the action state in a superposition with the corresponding amplitude. Then the interaction with the environment will make the second qubit switch only if the first qubit is in the state $|1_A\\rangle$, hence putting the reward qubit in the $|1_R\\rangle$ state.\n", "\n", "![classical_circuit.png](../_static/img/reinforcement-learning_classical_circuit.png)\n", "\n", "The detector D1, corresponding to $|0_A0_R\\rangle$, will click with probability $\\cos^2(\\xi) = 1-\\varepsilon$ and corresponds to no reward, whereas detector D2, corresponding to $|1_A1_R\\rangle$, will click with probability $\\sin^2(\\xi) = \\varepsilon$ and correspond to a rewarded action.\n", "\n", "Both operations $U_p$ and $U_e$ were already implemented as part of the Grover's algorithm." ] }, { "cell_type": "code", "execution_count": 15, "id": "4fe0e455", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "U_P\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=3*pi/2\n", "\n", "\n", "Φ=3*pi/2\n", "\n", "\n", "\n", "\n", "U_E\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=2*pi\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "0\n", "1\n", "2\n", "3\n", "0\n", "1\n", "2\n", "3\n", "" ], "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classical_circuit = pcvl.Circuit(4)\n", "classical_circuit.add(1, state_prep).add(2, env) # circuit for classical strategy\n", "pcvl.pdisplay(classical_circuit, recursive=True)" ] }, { "cell_type": "markdown", "id": "d288dabc", "metadata": {}, "source": [ "### Quantum circuit" ] }, { "attachments": {}, "cell_type": "markdown", "id": "6fad7238", "metadata": {}, "source": [ "The quantum circuit performs a Grover's amplification step in order to get the state closer to a rewarded state. However, during this step, no reward is ever perceived and a classical round is still needed afterward to check if the state is rewarded or not.\n", "\n", "![quantum_circuit.png](../_static/img/reinforcement-learning_quantum_circuit.png)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "c3f95a3e", "metadata": {}, "source": [ "We will here, directly append the classical circuit (without state preparation) to the quantum circuit, so that the whole operation is done with one circuits. Note that we will count this as being 2 epochs to have a fair comparison with the classical strategy.\n", "\n", "![classical_quantum.png](../_static/img/reinforcement-learning_classical_quantum.png)" ] }, { "cell_type": "code", "execution_count": 16, "id": "c1a8c795", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "U_P\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=3*pi/2\n", "\n", "\n", "Φ=3*pi/2\n", "\n", "\n", "\n", "H\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "\n", "H\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "U_E\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=2*pi\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "H\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "H\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "Φ=5*pi/4\n", "\n", "\n", "\n", "U_REF\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=pi\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=0\n", "\n", "\n", "\n", "\n", "U_E\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=2*pi\n", "\n", "\n", "\n", "\n", "Rx\n", "\n", "\n", "Φ=0\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "Φ=pi/2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "0\n", "1\n", "2\n", "3\n", "0\n", "1\n", "2\n", "3\n", "" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "quantum_circuit = pcvl.Circuit(4)\n", "quantum_circuit.add(1, state_prep).add(0, hadamard).add(2, hadamard).add(2, env).add(0, hadamard).add(2, hadamard).add(1, ref) #circuit for quantum strategy\n", "quantum_circuit.add(2,env) #appending directly the classical round (without preparation) at the end\n", "pcvl.pdisplay(quantum_circuit, recursive=True)" ] }, { "cell_type": "markdown", "id": "367229cf", "metadata": {}, "source": [ "### Simulation" ] }, { "cell_type": "code", "execution_count": 17, "id": "318570c5", "metadata": {}, "outputs": [], "source": [ "# Simulation parameters\n", "N_AGENTS = 100 #number of agents that we simulate and average over\n", "N_EPOCH = 1000\n", "H_0 = 99\n", "H_1 = 1\n", "EPS0 = H_1 / (H_0+H_1)" ] }, { "cell_type": "markdown", "id": "46ff0d04", "metadata": {}, "source": [ "#### Reward function\n", "First we define a reward function that takes as an input a circuit, output a sample state and returns True if it corresponds to a rewarded state (False otherwise)." ] }, { "cell_type": "code", "execution_count": 18, "id": "2369c08f", "metadata": {}, "outputs": [], "source": [ "def get_reward(circuit: pcvl.Circuit) -> bool:\n", " proc = pcvl.Processor(\"SLOS\", circuit)\n", " proc.with_input(pcvl.BasicState([0, 1, 0, 0]))\n", " sampler = pcvl.algorithm.Sampler(proc)\n", " samples = sampler.samples(1)\n", "\n", " # Take a random sample and check if it's the rewarded state or not\n", " return samples[\"results\"][0] == pcvl.BasicState([0, 0, 0, 1])\n" ] }, { "cell_type": "markdown", "id": "ae5b5de3", "metadata": {}, "source": [ "#### Classical strategy" ] }, { "cell_type": "markdown", "id": "2aa85433", "metadata": {}, "source": [ "Below we gather everything defined above to run the purely classical strategy from the article." ] }, { "cell_type": "code", "execution_count": 20, "id": "5cdf619c", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4598a7b34e00401bb4092b2f839a8286", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "eta_classical = []\n", "\n", "# Pourcentage bar\n", "f = FloatProgress(min=0, max=N_AGENTS)\n", "display(f)\n", "\n", "for agent in range(N_AGENTS): #Loop and average over all agents\n", " f.value = agent\n", " # Initialize initial score\n", " h_0 = H_0\n", " h_1 = H_1\n", " eps = h_1 / (h_0 + h_1)\n", "\n", " # Initialize circuit with initial probability and corresponding angles\n", " xi = np.arcsin(eps**0.5)\n", " \n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", "\n", " # Arrays of epsilon\n", " eps_array = []\n", " for i in range(N_EPOCH):\n", " if get_reward(classical_circuit): #update policy if output state corresponds to a rewarded state\n", " h_1 = h_1 + 2\n", " eps = h_1 / (h_0 + h_1)\n", " xi = np.arcsin(eps**0.5)\n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " eps_array.append(1)\n", " else:\n", " eps_array.append(0)\n", "\n", " eta_classical.append(eps_array)\n", "\n", "eta_classical = np.array(eta_classical)\n", "f.value = N_AGENTS" ] }, { "cell_type": "code", "execution_count": 21, "id": "413721c6", "metadata": {}, "outputs": [ { "data": { "image/png": "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khJ+8IMfuO658sorueqqq5g+fTrjxo2zt4Ss+2644QYuuugiNm3axG9/+1uWLFnC2bNnAfjud79LSUkJ//Ef/2GPz9r2svj85z/Pl7/8Zdku6iGcWzXe/1d+15zngG4pZ7XhKH98cTsKWFhSSMHgPALKeHXnODT03JwAP7z5SkonFPDMln0ElCKm21/+wYCK0+6Lxw6zr8+ZPIIBuQH72sETp6lsCNvvEO+cCgbn2fOZM3kE66pC9qogNycQ553kvR/gvrlT7LFqbawWhg7IYf2eCPmTet7LSGmdeO+qLzNz5kztNWB+8MEHXHrppR3emwl5fR599FGampr453/+5x7pLxPm3NNYcz516hRDhgxBa819993H1KlT+eY3vwkYXl/f/OY3efvttxP209m/q75AbxaLSeak4XcNiDOseo2vnXnm4l/8iTbzNZYTVATM7ZdgQLHiC8Uubd1p0D3T6t5Myg0qnl12DQDrqkL29o7XGJzomnOelm0ioHDNLSeguGXmOBYmcFX1fk+Wgdo7VgUMyO2eI4xSqlJrPdPvWtavEPoiN910E3v27OGNN97o7aH0C371q1/x1FNPEYlEuOqqq7j33nsBeOSRR/j5z38utoMeIpmTht81wLW1o81d8kgCBw+/FcbmukZbGAC0RTXK7ElrTfXBJsItEXsF8vimWtug66Utqtlc18h9c6cY/UaNsZ0xXVCdW0fWNedc1lWFqDnQZBuegTjDciSq2VLXyNHms4zKHxAnGDbXNdrCJNLabqD2Yhmpe8IRxokIhD5IV11VheR885vftFcETh588EEefPDBXhhR/ySZk0aia9Y5pQzfejBeogWD81x9J1p9zJk8ghxF3ArBz4jr1NJzggHa2mIug7NzXM4ANDBcUJf8ajOr75kTN5eCwXlxbq22rcFcIcQwBA5A7dGPqT36MYDt0mq91AsG57ULE6BozFC21DXGeUkpz3h7in4nELTWkpBM6DEydUu1OyTb/+/svcsXFNkauXd/3M+Bwzp38MRpntmyL85ga/XrctN0uG8WDM7jk2OD5A4daWvcYGjr7+09Tq3pqunU0qMxzacuvYAzrVGKxgzl5Nk22/5gjat0QgG3zBzH01vaDc+WRn7f3Ck8vXQO66pCHGs+y5qKfXHG609MHUnRmKG8W9fI6KGG990fdxyO+96cWn5lQ5gN1Yds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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(np.mean(eta_classical, axis=0)[::2], \".\", label=\"Fully classical strategy\")\n", "plt.xlabel(\"Even epochs\")\n", "plt.ylabel(\"$\\eta$\")\n", "plt.legend()\n", "plt.grid()" ] }, { "cell_type": "markdown", "id": "9ab3f4c9", "metadata": {}, "source": [ "Here we plot the proportion of agents that gets a reward. In the first epochs, the probability of getting a reward is small and few agents get some. However, once an agent gets a reward, they are more likely to get a reward in the future." ] }, { "cell_type": "markdown", "id": "e4e33516", "metadata": {}, "source": [ "#### Quantum strategy" ] }, { "cell_type": "markdown", "id": "3235182e", "metadata": {}, "source": [ "Below we run the purely quantum strategy." ] }, { "cell_type": "code", "execution_count": 22, "id": "63cdbf11", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "621985a90efe40b2b959e2868589ae66", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "eta_quantum = []\n", "\n", "# Pourcentage bar\n", "f = FloatProgress(min=0, max=N_AGENTS)\n", "display(f)\n", "\n", "for agent in range(N_AGENTS):\n", " f.value = agent\n", " # Initialize initial scores\n", " h_0 = H_0\n", " h_1 = H_1\n", " eps = h_1 / (h_0 + h_1)\n", "\n", " # Initialize circuit with initial probability\n", " xi = np.arcsin(eps**0.5)\n", " \n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " \n", " theta2 = np.pi - 4*xi\n", " theta_ref.set_value(theta2)\n", " theta2_ref.set_value(-np.pi/2 - theta2/2)\n", "\n", " # Arrays of epsilon\n", " eps_array = []\n", " for i in range(N_EPOCH//2):\n", " if get_reward(quantum_circuit):\n", " h_1 = h_1 + 2\n", " eps = h_1 / (h_0 + h_1)\n", " xi = np.arcsin(eps**0.5)\n", " \n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " \n", " theta2 = np.pi - 4*xi\n", " theta_ref.set_value(theta2)\n", " theta2_ref.set_value(-np.pi/2 - theta2/2)\n", " \n", " eps_array.append(0.5)\n", " eps_array.append(0.5)\n", " else:\n", " eps_array.append(0)\n", " eps_array.append(0)\n", "\n", " eta_quantum.append(eps_array)\n", "\n", "eta_quantum = np.array(eta_quantum)\n", "f.value=N_AGENTS" ] }, { "cell_type": "code", "execution_count": 23, "id": "6678e44f", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEGCAYAAABlxeIAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAABAgUlEQVR4nO29e3hV5Znw/bv3TsIxYEBFlLNQ0IBgEgRfeinUQ2EK2KKtBb9ObaW0vep808vXTq2doQ59Zy5bmVanZcZxrPV9v1GxioyWt7QeStRaEUgqmgBqCAkEkEPYnAyQZO/n+2MdWHvttbNz2nsn2ffvunIla61nrfU8a++s+7mf+yTGGBRFURQllO0OKIqiKD0DFQiKoigKoAJBURRFsVGBoCiKogAqEBRFURSbvGx3oLNceOGFZty4cZ0695NPPmHQoEHd26Eejo45N9Ax5wZdGXNFRcVRY8xFQcd6rUAYN24c27Zt69S55eXlzJ07t3s71MPRMecGOubcoCtjFpH6ZMd0yUhRFEUBVCAoiqIoNioQFEVRFKAX2xAUpS/Q0tJCQ0MDZ8+e7ZbrDR06lJ07d3bLtXoLOuZg+vfvz6hRo8jPz2/3dVUgKEoWaWhooLCwkHHjxiEiXb7eqVOnKCws7Iae9R50zIkYY2hsbKShoYHx48e3+7q6ZKQoWeTs2bMMHz68W4SBojiICMOHD++w5qkCoRuoqI+wZlMNFfWRbHdF6YWoMFDSQWe+V7pk1EUq6iPc8fhmmltjFOSFeGr5bErHFmW7W4qiKB1GNYQusrm2kebWGDEDLa0xNtc2ZrtLitIhwuEwM2bMcH/q6uqStn3yySe5++67AXjggQdYvXp1hnrZPsrLy/nzn/+csfvV1dXx9NNPd/i848eP82//9m9p6FHXUIHQRWZPGE5BXogQlopWNLAg7rguJyk9nQEDBvDuu++6P51NCdMT6EkCobW1Nel5KhD6KKVji1i5sJhQSIgZw6oN1e7L31lO+peXP+COxzerUFC6hUxMMsaNG8fRo0cB2LZtW5tpEnbv3k1JSYm7/dFHH8VtO1RUVDB9+nSmT5/O9773PaZOnQrEax0ACxcupLy8HIBvf/vblJWVUVxczI9+9KO4/v3oRz+ipKSE2bNns2vXLurq6nj00Uf5+c9/zowZM3jzzTe58847ef75593zBg8eDFiC4/rrr+eWW25hwoQJ3HfffTz11FNcc801TJs2jd27dyf0//XXX3e1qKuvvppTp05x33338eabbzJjxgx+/vOf8+STT7J48WI+85nPcMMNN3D69GluuOEGSkpKmDZtGi+++CIA9913H7t372bGjBl873vfA+Chhx5i5syZXHXVVXFj/fGPf8zkyZP59Kc/zdKlS1m9ejW1tbXteuYdRW0I3UCkqZlozGCA5hZr2ah0bBEvVDZwtiUGvv2K0lnSYbM6c+YMM2bMAGD8+PGsX7++Q+dffvnlDB06lHfffZcZM2bw61//mq997WsJ7b72ta/xy1/+kuuuu859Cabin/7pnxg2bBjRaJQbbriB9957j6uuugqACy+8kMrKSn72s5+xevVqHn/8cb71rW8xePBg7r33XgB+9atfJb329u3b2blzJ8OGDWPChAksX76cLVu28Mgjj/CLX/yChx9+OK796tWrWbNmDXPmzOH06dP079+fBx98kNWrV7NhwwbAEm6VlZW89957DBs2jNbWVtavX8+QIUM4evQos2fPZvHixTz44INUVVXx7rvvAvDyyy/z0UcfsWXLFowxLF68mDfeeIMBAwawbt06tm/fTktLCyUlJZSWljJhwoR2PfOOohpCN1A0sACnMnXM3q6oj/Ds1r1uG2e/onSFdNisvEtGHRUGDsuXL+fXv/410WiUZ599lmXLlsUdP378OMePH+e6664D4Ctf+Uq7rvub3/yGkpISrr76aqqrq9mxY4d7bMmSJQAp7R7JmDlzJiNHjqRfv35cfvnl3HzzzQBMmzYt8Hpz5szhnnvu4V//9V85fvw4eXnB8+mbbrqJYcOGAVY8wP33389VV13FjTfeyP79+zl06FDCOS+//DIvv/wyV199NSUlJezatYuPPvqIt956i1tuuYX+/ftTWFjIokWL3HNSPfPOoAKhizz9zl4ee2M3joNXSCyNYXNtI9HY+XaCtV9RuoJjswoL5OeFmD1heFruk5eXRyxmfYHb48t+6623snHjRjZs2EBpaSnDh7e/X957ee+3Z88eVq9ezWuvvcZ7773H5z73ubi+9OvXD7CM4snW673XjsViNDc3J5wPEAqF3O1QKBR4vfvuu4/HH3+cM2fOMGfOHHbt2hV4T29a6qeeeoojR45QUVHBu+++y4gRIwKfpzGGH/zgB65grqmp4a677gq8vkNXnnkyVCB0gaff2cv969+nrrEJg/XSL7D/SWdPGE5++LwfcDr/eZXcoXRsEU8tn809N09Oq4vzuHHjqKioAGDdunUp2/fv35/PfvazfPvb3w5curjgggu44IIL+NOf/gRYL0rvvd59911isRj79u1jy5YtAJw8eZJBgwYxdOhQDh06xMaNG1P2o7CwkFOnTgWO46WXXqKlpSXlNZKxe/dupk2bxve//31mzpzJrl27Eu7n58SJE1x88cXk5+ezadMm6uvrA/v52c9+lieeeILTp08DsH//fg4fPsycOXP47W9/y9mzZzl9+rS7NAWpn3lnUBtCF9hYdTBue+zwgfzLl2bwwcen2Fh1kK/PGc/Jc60IUHzpUFe9VzuC0hVKxxal/Tv0ox/9iLvuuot/+Id/aHfe/TvuuIP169e7Sy9+fv3rX/P1r38dEYlrM2fOHMaPH8+VV17JFVdc4RpHp0+fztVXX82UKVMYPXo0c+bMSdmHRYsWcdttt/Hiiy/yi1/8gm984xvccsstTJ8+nfnz53epkM7DDz/Mpk2bCIVCFBcXs2DBAkKhEOFwmOnTp3PnnXdSVBT/udxxxx0sWrSIadOmUVZWxpQpUwAYPnw4c+bMYerUqSxYsICHHnqInTt3cu211wKW8fu//uu/mDlzJosXL+aqq65ixIgRTJs2jaFDh8Zdv61n3lHEGJO6VQ+krKzMZLtAjqMhOPzzF6YBJOybfElh1oPXtIhIz2Tnzp1cccUV3Xa9bOb1Wb16NSdOnODHP/5xyrZ1dXUsXLiQqqqqLt+3r+cyOn36NIMHD6apqYnrrruOxx57jEmTJlFYWJjymQd9v0SkwhhTFtReNYQusGzWGMDSFBZMHcmyWWP4yq/eiWuzseogkabmBEOgaglKX+ILX/gCu3fv5o9//GO2u9LnWLFiBTt27ODs2bN89atfpaSkhFOnTqXlmatA6AQV9RE21zYye8Jwls0a4woGgOKRQ3jzo6Nx244hsKU15toSvNdQ4aD0djrqnTRu3Lhu0Q5ygWSBb531CGuLjAgEEZkPPAKEgceNMQ8maXcr8Dww0xjTufWgNNOWH3hFfYQn365z2wrw5Nt13FR8CU8tn+0KACDrS0hKz8EYownulG6nM+aAtHsZiUgYWAMsAK4ElorIlQHtCoG/Bd7xH+tJeP3Am1tiPPzqh27EqHPMwRC/RPSdeRMpHVuk+Y8Ul/79+9PY2Nipf15FSYZTD6F///4dOi8TGsI1QI0xphZARNYCtwA7fO1+DPwEaF8IY5Zwln+aW2LEgLdqjrK17hhPLZ+dcCyUxFc8aAlJyU1GjRpFQ0MDR44c6ZbrnT17tsMvgd6OjjkYp2JaR0i7l5GI3AbMN8Yst7e/AswyxtztaVMC/NAYc6uIlAP3Bi0ZicgKYAXAiBEjSteuXdupPjlW+85SE4ny3zXNVDfGMFhq1pJJ+UwZFuat/S2AMHZIiNMthinDwkwsCgdeY9exaNLj3U1Xx9wb0THnBjrmjjFv3rye62UkIiHgZ8CdqdoaYx4DHgPL7bSzLoVddUecC1xt2xKcWX7J1Cms2lDt2gXuXnRNm3aBzt+9c/QGF8zuRsecG+iYu49MCIT9wGjP9ih7n0MhMBUotw1rlwAvicjinmpYhvMRo46hOMguoIZiRVF6E5kQCFuBSSIyHksQfBlwszAZY04AFzrbbS0Z9SQq6iOsq2xwcxipa6miKL2dtAsEY0yriNwN/AHL7fQJY0y1iKwCthljXkp3H7qbivoISx97m+aoZX95rqKBZ74xW11LFUXp1WTEhmCM+R3wO9++lUnazs1En7rCC5UNrjCA80tEXm8hXUJSFKW3kXWjcm+joj7Cc9v2xe3LzwtRNLAgTiNYubBYXUsVRelVqEDoIC9UNtDi0Q6mjxrKykXFCRpBpKk5YQnp/vXvI8CSklGB2oLaHBRFySYqEDqAox044qAgL8TKRcXuy9uvEThpipPZHLwv/XSURlQURekIKhA6wObaRlpj1ktdgNtKz8/0/W6o3pf55trGOK0iyKagNgdFUbKNCoQO4HctvbUkPiw8WeESp3qaoyGEQuLWV376nb1srDpI8cghanNQFCWrqEDoAG1pAanOe2bFtTz6+m7+uOswxhhWbahmb+MnPPpGLQBvfnSUb103gcIB+WpDUBQlK6hA6CCdKV/oGIsvLuyHMcZdFvp99cdx7d6ubeTFuz/dnd1VFEVpNyoQ0ozXWJwXEvLCIaJRa1lofvElroYAsOPgSSrqI6odKIqSFVQgpBmvsTgaM9x+zWguu2CAuyxUe/QTXt5xCIBYzKgxWVGUrKECIc0EGaK9L/xvXn85b3x0RI3JiqJkHRUIacZriC4aWOBWR2uPu6qiKEomUYGQAZyXfLLAs84YqhVFUbqbtNdUViy0jrKiKD0d1RA6SGfzDXltCSLwcvXHnDrTonEHiqL0GFQgdICu5BtybAWPvr6bV3YcYnvDCbY3nECAfvmau0hRlOyjS0YdoKvLPqVjizjbEo3bZ9AlJEVRegYqEDqAs+wTFjrtIrpg6siEfeGwupsqipJ9dMmoA3SHi+iyWWMo/+CwG4zmz5qqKIqSLVQgdJDucBH1B6P5s6YqiqJkAxUIWUCD0RRF6YmoQOgA3VniUoPRFEXpaahAaCda4lJRlL6Oehm1k2xFGlfUR1izqYaK+khG7qcoSu6iGkI78WctzYSbqGoliqJkEhUIHWBJySjE/p2uF7PXThGklahAUBQlXahAaAf+mfqSNLmJ+u+zcmFxxrUSRVFyFxUI7SBTM3X/fSJNzeqeqihKxlCB0A4yZT8Iuo+6pyqKkilUILSDTAWSacCaoijZRAVCO8nETL07A98URVE6igqEHoK6mCqKkm00MK2dpDtATEtsKoqSbVRDaAeZmL1nI/BNURTFiwqEdpAJt9Mgg7LaFBRFySQqENpBpmbvXsO12hQURck0KhDaQTbcQTVthaIomUYFQgq8yzbfmTcxY/dVm4KiKJkmIwJBROYDjwBh4HFjzIO+498CvgNEgdPACmPMjkz0rS2yuWyjQWqKomSatLudikgYWAMsAK4ElorIlb5mTxtjphljZgA/BX6W7n61B++yzbmWGOsqGzJ6/9KxRW7WU8fd1e/+qvUSFEXpLjKhIVwD1BhjagFEZC1wC+BqAMaYk572gwCTgX6lZPaE4eSFhOaowQDPVzRwaxpTX/sJyn66akN10m01PCuK0hXEmPS+e0XkNmC+MWa5vf0VYJYx5m5fu+8A9wAFwGeMMR8FXGsFsAJgxIgRpWvXru1Un06fPs3gwYPb1fZ/V51jU0MrYKlTSybls/Dygk7dty1qIlF2HYsyZViYiUVhyve2sLGuhUNNxr33lcNDVDfGMEm22+pbR8bcV9Ax5wY65o4xb968CmNMWdCxHmNUNsasAdaIyDLg74GvBrR5DHgMoKyszMydO7dT9yovL6e95xaOj/D245td4+7SG2d2+yy8oj7C6tccTSDKndeO48kdte5xAQryQyy7ztIInL74t9vqW0fG3FfQMecGOubuIxMCYT8w2rM9yt6XjLXAv6e1Rx0gE8Zdv4vp76s/jjs+dvhA/uVLMygdW8TkSwrj+uLfVhRF6SyZEAhbgUkiMh5LEHwZWOZtICKTPEtEnwMSlouySboznfpdTOcXX8Kjb5zXEOYXX+LmNvL3ReslKIrSXaRdIBhjWkXkbuAPWG6nTxhjqkVkFbDNGPMScLeI3Ai0ABEClov6MkFayJjhg9hYdZDikUN48u06NRwripJ2MmJDMMb8Dvidb99Kz99/m4l+9FT8OYsq6iNEmpr57o2f0ohlRVEyRo8xKucq7XEt1YhlRVEygQqELOPXADZWHXS3m1tjRJqa3eWkooEFcbYERVGU7kQFQpbxG5SLRw7hzY+OAhAzUDSwwH35a/ZTRVHSiQqELOM3KG+ubUTADTaLNDUD8ZpEc0uMh1/9kO/e+Cn3mLqdKorSVVQg9AD8rqP98hNtBo4m0dwSIwa8VXOUd2obQYTWqGoNiqJ0Ha2p3MNwNIZ7bp4c94J39s+ZdCEhsZaTWqKGFq3DrChKN6EaQg8kWbBZ6dgivnvjp9had4yW1hjhkIAI0aj194HjZ6ioj6iWoChKp1CB0Mvw2xwA1lU28HxFA89s2cu6ygZdOlIUpVOoQEhBTyx079cgNtc20hrV4DVFUbqGCoQ26C2F7rXcpqIo3YEKhDZ4obKBcy1WvYFszrxTaSlablNRlO5ABUISKuojPLdtn1u6LRzOzsy7vVqKZj1VFKWrqNtpEjbXNtIas8SBALeVZq50pr8f/uR2iqIo6UAFQhKcdfmwWIFit5aMyno/1D6gKEo60SWjJPSUdfme0g9FUfo+KhACcIy4RQODC9ZnGkcIrKts4IXKBpbY2ooKCUVRuhMVCD4cI67jXRQSsu5yWlEfYeljb9MctWwaz27bR0hzGCmK0s2oDcGHY8R1vIt6gjF3c20jLVHjbre2I4dRRX2ENZtqqKiPZLKriqL0YlRD8OHPKhrqAcbc2ROGkx8WV0PICwshO4dRUN+CXFUVRVFSoQLBh9eIWzSwgEhTc9bX6UvHFvHMimtZV9mAQEobQpCrarFkoeOKovQqVCAE0BODvJw+eaOWvzNvYmDboFQWp/Y0ZLjHiqL0NlQg9CI6ErXsd1Ut35OFDiuK0qtQo3Ivoj1Ry44xGeA78yb2OE1HUZSei2oIvYhUWU17S3ZWRVF6JioQehF+g7c3UK10bFGcBnGuJcbDr37Id2/8lAoFRVHahQqEXobzcvcGqj1X0cAz35hN0cAC7Hx8GOBPHx1la90xdTtVFKVdqEDohfgD1bz2BAE3qM5bx6Hf8SjVm2qy7kKrKErPRQVCL8QfqOa1J/TLTwyqKxpYwAOvnKXVfKC2BUVRkqICoRcSFKjmvOCDguo21zbSEiPrld8URenZqEBIQqqyldkmKHjO32dv1tb8EERN9tNwKIrSc1GBEEBvdN/093nlwmJWbah2t5dNKeCi0eN7rIBTFCX7aGBaAC9UNnCupXeVrfQHrW2sOhi3fbrFaKCaoihtklIgiMg9IrJdRP4oIo+IyNdFpFRE+mWig5mmoj7Cc9v2uZ464XDvWGLxl9pcMHVk3PaUYeFsd1FRlB5Oe5aM/ga4CYgCVwEzgEXAVBE5Z4yZmr7uZZ7NtY202s78AtxWOqrHz6odW8HKhcVx2VknX1Lo2hRO7dme7W4qitLDaY9A+ADYbYwxwB7gReeAiAxNV8eyhT89xK12qumeSlv2Dq/hWZPbKYqSivYIhMPAEyKyyhgT91oxxpxIT7eyR28rah+U8K6n91lRlJ5JewRCFTANWC8iFwI7gfeMMf8zrT3LIj2xHkIyvBpNOCQcOH6GivpIXP+ffmcvT289w4EBe1k2a0wWe6soSk8mpVHZGPNTY8xXjDEzgHHAd4GtHbmJiMwXkQ9EpEZE7gs4fo+I7BCR90TkNREZ25Hr5zKORnP7NWNAhGe27OWOxze7tZSffmcv969/n6rGGPevf5+n39mb5R4ritJT6ZDbqTGm1RhTbYxZ295zRCQMrAEWAFcCS0XkSl+zvwBlxpirgOeBn3akX7lO6dgiLrtgAK3RRFfZjVUH49r6txVFURwyEYdwDVBjjKk1xjQDa4FbvA2MMZuMMU325magZ1tyeyB+t1PHVXbB1JFx7fzbiqIoDmI5D6XxBiK3AfONMcvt7a8As4wxdydp/0vgY2PM/wo4tgJYATBixIjStWvbrajEcfr0aQYPHhx4rCYSZdexKFOGhZlY1Dt8950+D84XTreYhL6X721h84FzzL60H3PH5KccY298BkG09Tn3VXTMuUFXxjxv3rwKY0xZ0LEelbpCRP4foAy4Pui4MeYx4DGAsrIyM3fu3E7dp7y8nKBzK+ojrH7NceGM9pqUFef7HJxmYy7nx5xqjL3xGSQj2efcl9Ex5wbpGnMmloz2A6M926PsfXGIyI3AD4HFxphzGehXAu2pWdzT6GifU7Xvjc9AUZTuIRMawlZgkoiMxxIEXwaWeRuIyNXAf2AtLR3OQJ8CSVWzuCcS1GdvllMnctmhaGABIbHK6ASNsTc+A0VRuoe0CwRjTKuI3A38AQgDTxhjqkVkFbDNGPMS8BAwGHhORAD2GmMWp7tvfnpbUBok9hngjsc3c64lhsEqklOQF+LekgIK6yOs2lBNNGYIh4SVC4sTxtgbn4GiKN1DRmwIxpjfAb/z7Vvp+fvGTPSjPfSmoDQHb5/XbKqhuTXmJudzln52HYtyzl4OMoAxhqoDJ1izqSZOk/Bey1ku6m3PQ1GUztGjjMpK13GWfPxlNKcMC3O1L6r5+YoGWlrjNYmnls8G6HX1IBRF6ToqEPoY3iWfooEFVB04gQBwmNKxRaxcWMzGqoMMyA/z6s5DCZqEoxVofiRFyT1UIPRBnGWfCttm0NwaI09g4KV7z2+HhLxwiNbWeE3CsUOoYVlRcg8VCH0YrwtpqyGuilpr1DBt1BBGDOkPwEWF/VhScr72gxqWFSX3UIHQh4nLhCpW2oqtdcdc+8J7DScwnHDtB0s8tR96o3FdUZSuoQKhD+O1J/Q7Xs+yWWOYfEkhD7/6IW/VHMUuDKe2AkVRgMxEKitZpHRsEd+ZN9HNSVQ6tojv3vgpCvJC7ofvtR9U1EdYs6nGTZ+tKEruoBpCDuL3RPJGM6u7qaLkLioQcpQgG4ET1KZLSIqSm+iSkeKSrKaCoii5gWoIOUpFfYR1lQ0IxLmbLikZlbDPf54/6C1ZW0VRehcqEHKQivoISx97m+ao5Wb0XEUDDywqdoPW/C6o3vO8ifMcnqto4JlvqL1BUXo7umSUg2yubaQlev6V3tIaiwtaS1YHYbMnOZ4XrZugKH0D1RByCO9yT35YXA0hPy8UF7QmIhQNLIg7Z/aE4QmJ8xzU3qAofQMVCDlCTSQaV2rzgcVTA20AK1+sImYMqzZUA8QtIz21fHZg4jy1IShK30AFgodkhta+wK5j0bgloUhTM//8hWnu8Yr6CBurDhIzhpiBcy0xnt261z3nXEuMR1/fzUWF/Th66hwXFfbj1j72jBQl11GBYBNkaO1LhtIpw8IU5EUDM5gGGYsNUH3wJKGQEIsaDPDKjkNx1+xrz0hRch01Ktu8UNngCgPoe4bSiUVhVi4s5n9MvDChdKbXWCyec0zMUDxySNw+L33tGSlKrqMaAtYM+blt++L29TVDqWVDsOwBW+uOMfmSQlcozPZVUkOEaNTSJG6fOYYPDlUnGJKh7z0jRcl1VCBgzZBbY+e1g+mjhrJyUWIB+t6M34bgTUvhzW3kvOC9tRAmX1IYZ0h2bAh9zc6iKLmOCgTiZ8j5eaE+JwwgtQ3BXwzHP/79x89w4PiZDhmSg66rKErPRQUCiTPkvvjymlgUDhyjY1BOluG0s8b2VNdVFKXnoQLBJhcqhAWN0VtmMyjDaVBUc1AWVL824L1us8f47E+53defuaL0JlQg5Dj+5TK/kXj2hOEJUc3+NkHaQNHAgriKbKfOtMS5tjplO1VzUJSegwqEHMdZLnMC8oKOP7Pi2jYD9jbXNrov+uaW89qAgOvK+rYvD5LWXFCUnocKBAWw4zBaY6yrbEiYtadaTisaWHD+RW9vT76k0NUsnCC3vHCI1lbLfdVbtlNRlJ6BCgQlpR0hFZGmZkJizfoFqDpwgmWzxvDFstE8/c5eDFaQ223XjOayCwaoDUFReigqEJSUdoT2nJ8XOq8NPF/RwK0lo1hSMop1lQ3udTX3kaL0bFQgKF12uy0dWxSnDUSjlpbxnXkT+7w7r6L0JVQg2OR6EFWQneDpd/ayseogC6aOZNmsMW2e72gDzS1WgovXPzjMgeNnWFIyiu/MmxjXNteftaL0VFQgoEFUQTz9zl7uX/8+AG9+dBSgTaFQOraIlQuL+Yf/fp+ogS11EbbURRIC2fRZK0rPRQUCloeN4zaprpAWG6sOJmz7BYK3AlukqZkDx8/gSQkFJD5PrwH7XIvl1dTWsw7SJrpbw+jLdTAUpSPkvEBwMp0677FwWF0hARZMHelqBs62F38NhZBYP/56y34jdTIDdNBLOEibALpVw+jrdTAUpSPkvEDwZjoV4LZSnSHC+eWhZDaEzQGBZsYnDSZePJif3HpVQkxDkAE6aPYf5A4LdEjDSEV7U3MoSi6Q8wLB73J5a8mobHepx7Bs1pikdgPnuTl1EkICeSEhBrTaL9i9x5oCz/W7ozoahF8jWLmwONAdtr0aRntoT2oORckVcl4g5EKm03TgfW7eQLMXKhuSzv6DzvU+c79GEGlqDmzXlobRmXGkSs2hKLlCzgsEyI1Mp+nA+yL3vrCDZv+QaLz1u6MGBcgFfTZ+DaNoYAFrNtV0WqDr568oFhkRCCIyH3gECAOPG2Me9B2/DngYuAr4sjHm+Uz0S+kayVxIk9VdSGW8ba+25tdOVm2oVjdWRekG0i4QRCQMrAFuAhqArSLykjFmh6fZXuBO4N5098eL321Sl4ySE+TqGZTl1JltB2VE9Rpvm1tjPPzqh3z3xk8BllbhLc0JsGZTTdLPxrnHmk01gXmYKuojbNjdTOH4SELBn3QtD2rAndLbyYSGcA1QY4ypBRCRtcAtgCsQjDF19jF/Hfe0EeQ2qTPMYJJpAkFZTpPhN94CvFVzlHdqG+MM0QDPbttHSISW1tSfTdAyk/ez3VC32T0vnUFxGnCn9AUyIRAuA/Z5thuAWZ25kIisAFYAjBgxgvLy8k516PTp02x4dasrDMBym2xuifHMq1s5dXnyF1tv5fTp051+Xht2N8dpAr/87TsMHxCi8YyJq3lQWbWLS8/UJr3O35X14639LdSfNOw5aVdTi/ojFxzhcH6//7OpiUTZdSzKlGFhAK4dIUAecy7L4y+Vlfx3zfn+nrP7+9Wp/RPGkeqz9t5nYlG4Q88oW9+jrnzOvRUdc/fRq4zKxpjHgMcAysrKzNy5czt1nfLycpZOm86Gus1xbpMFeSGW3jizT87sysvL6ezzKhwfYUPdZlpaY4RDwlsfG1qjLeSFhPy8ENGoNTtP9ezmAstJtCcEkR8WolGT8NkArH7NmonnhVpBhNaoNSu/aeYkVm2ojhP0BnjrY8Pdi6azdDzuOFL1t6I+4t6nIC+acsbvfUbteRbpoiufc29Fx9x9ZEIg7AdGe7ZH2fuySjK3yb4oDLqK91kdOH6GZ7bsJWYgGjPcbtc46Miz8wenhYCLh/Tj45PnAEsAfLEsuHZCnM3A1iSclCMbqw66wXKO5gKdy77a0RoR6r6s9AUyIRC2ApNEZDyWIPgysCwD902Juhu2H+dZOa6j7a1xkCxPkDc7aigkfH7GZTz5dp2rhQgkeCmt2VTDqTMthMR63eeFBESIRq1zBuSHyQuH3O2YMRhDnG0h2QvbfyxZjYi2HBH0+6T0dtIuEIwxrSJyN/AHLLfTJ4wx1SKyCthmjHlJRGYC64EiYJGI/KMxpjjdfVM6Tkdmwm25mjrZUVe+WEXMGJ58u46VC4upOnCC5ysaeGbLXrecJxDnACBAOCQ8sHgqky8pZF1lA89XNPDqzkPkhYQvXzOGJSWj+EtlJecuGOu+zJMZfdvrPquOCEpfJyM2BGPM74Df+fat9Py9FWspSekFtHcmnCpPUKSpmWjMuIbYSFMzl10wwPUuOtdiuaYOyA8n2AViMcPGqoNMvqQQsa9tsJaRjN3HU3vCzJ1rBb/9cP37cRlt11U2pMyZlCyS2uuI4B+Tup4qvZleZVRWehep8gQlc1v1vvi9GVcdxG7vdVv1nuPkN3LwZ7SVkPB8RYNrjPbnTCoaWJDUzdab3lt8Y1LXU6W3k/MCQWd06SNVnqBIUzMhsWbaIbG2AXefHwFuvHIEZ1uivFVz1GNYjsfRAG62b/VCZYPbToDikUN4f/8JN2Nq1YETPLV8thsc9+zWvYEG5UhTc5yx+vKLBjHLI+BSGaJ70netJ/VF6TnktEDQGV36aWt5KZnh1ptF1XkBO+v137r+cgC21h1zDdCI0NpqtYfzWsKE0gIKfdpBfl6I22eOYefBqriMqVMvHcrz2/bFucKGJF4D8Gs8NUc+ofboJ66tI9l4oGd913pSX5SeRU4LhI66FiqdJ2hG6nf9dY773YGDPHqcGb0AxZcOJdLUzPZ9x3llxyE3C+quY1HOBdS7WDZrDNUHTsRlTN1YdTBB25gz8UI3tYaTRuOKkUPY3nDCbeP97jhurU6/vLT3u5aJmXuyvvjvrVpE7pHTAqGtGZ3SfbQ1I3V++4/7M6EG8UJlQ9w5sycM542Pjrif55RhYa5OUu/CnzF1wdSRvFPb6M7+C/JCrjDwezhBvObi/+44/XI0h7bcWNv7nLqTttJ9eGtRaNLA3COnBYIGE2WGVLPjzmhqQef4A89O7dme9DMO2u+4sHrtHU4gnNdoHQLmTLqQBVNHJmguycbSnu9apjTWoL74kwQ6QX6qPecWOSsQvOpwe2ajSudx6ii3RA3hkCTMjpPNWNt6ebbnnPI9yfvkbQu49RT++QvTAu/jT3HiaA+Oi2pb/XJIZk/xBrtlQmMNerb+fi+YOtK106j2nDvkpECoiUQ9eWpUHc4IdnSx9Tse/4wVkgeRdeQcCF6G8bZ1op0dF1T/vZKlOEnWx45qnUFLNelMo5JsWSqZxqTac26RkwJh17FotxZqV9pmc20jrdFYyrKazr62ahx4X1DJzmluibHqt9UM4xz5e3cnBKTtO9Z0vq0ns6o/YK0tw6q/j/7z2utu6l0mclxg/VpK0DWefmcvG6sOsmDqyLi61zWRKNVtVI/z38/73ff3O1UAYmeNzkHnqQG7Z5CTAmHKsDB5odZuK9SutE1HjfftMXr6Z/L+pZ3znkCH3DZOQJoT1ewlJFY6DH/AWjLDqreP/vPakxbD2++8kLT5XfRf485rx/HoG1aacSdwb9msMVTUR/jp1rO0mg/arB+R6n7tobMG8FQam2rs2SWU7Q5kg4lFYb5YNtr1GHFmrUp6cJYj7rl5crv+2YPae2e2za2Jn5dzzpxJFya4fILlFTRu+CBXGHjbhLBcTL9YNprWaLBhtdlOo1FRH3FnsysXFnP7NWO4YuSQuPPWVTZw//r3WfF/trHqt9WBaTHg/Kx47uSL2/wu+o3Nv6/+OO74s1v3cv/691n122paYiT01/+cgr77TvJAf/tkJEv34Ywr2bWCzgvSWjpLqnF0dJy5Rk5qCJDodqhGs/TS0Uyg/vbetBExE1ydrXRsEd+98VNx7qNgzf7zQkJd4yeuZhAOCyE7U2q+x0jsd0XdWnfM1TqcVBmOzcGxP3gru4VDwm+27YurAOf0IVmaC39diVRG9/nFl7gaAkDVgRNxsRHe1B5b644lCGH/dz9Zqo62aCsbbHs0Of95mdBaNCAvNTkrENTltHfhTRsR4nyaCz/edBkH9x/gpplXEGlqdus4gPXC/FLZaG4tGZXw+QcZVh9+9UNfqgzjJtJz/na0jDHDBvL0O3sT+uUEuQW5p6aqKxH0XR0zfBAbqw4yID/MKzsOxbUfO3wge481JXUZ9V+vM+6uyf5/Ul0r2Xne+hjJ7EypSId7c66RcwLBX3xdvxC9g9kThtMvv312COdzLS9vpND2lCm+dGjcmr+zZOJ3OQ4yrC6YOpI/725EjInTLJy0GX4t4zlfCoxwSBg+qICHX/2QBVNHMvmSQvYfP+PWbvAGzG2ubeSDj08FehrtP36GFyob3OPO/co/OOzeLyQwv/gSt7ZEsmflH2dbKTeSTZqC/n9S2YuSXS+Zxt4RY3Oqe2sgamrEmORlDHsyZWVlZtu2bR06x5vPvl9+bqmMfaHMYEc9UR5f/xqrK5vjXDqdegvJ3EyD7umt6ZAXFlYtnhrnfhrkMbOusoGaQ6eo2HucqC9TX35YiMasAj9fLBvNElsYJKu1ACSUHPUff/T13fxx12FiMUO//I67rybz/Oms4Tjoc2rPkk5Q/YlU9/d+t1N9R/qKN1NX/p9FpMIYUxZ0LKc0BG8++7O2a+LKRcW9+ouRC3Q2iNDrXtzSer7egtcAHLRs4K3yBvEZVaNRQ6SpOa4fzsvLyXcUaWp2l6O2BRgvneu1Rg17jzUBVroLb82HmLG+o99f9x6zxg9LyLPkGNfXVTZw2QUDuLiwH8acry3x7Na9TL1saLufVdBsP86QbxupvcteHbmW/3qO8d0fGe49z/tMOrKU1VabnrYq0BkB5V/l6E5ySiB4Xe7Ack1c+p+b3SpeSs+jK4bAKcPCFORFA7OptrWk4dcIwmFxjcTJzgma3Tt1FrwverA1hKhJWtPBS83h0+w5ejquDw4xYy1POdpGXtgal+N2u73hRFyVuo7id+VNZqTu6PWcZTuv8d3fT38Ni3C47y3xdOa77f2ubajb3O2rHDklEByXu6c8Rj81LvVsumIInFgUDjRg+iOc13gCuTbXNiZoBEvtwC/vTNZL0Oze0Uice50608LbtY30y7M8vfcea+LQyXOe4LjkRGNw05UXc1FhP6r3n+C9hhOu62yr7ZnjGKY379xH7cnz1wsKmkuGv/419u8te45Rc/h0XNDfiCH9uaiwn9uuPcs0RQMLWFIyytW8ng74PwTL06t6/wk3Sy3AFZcUJu2zf7bcVhBfsujrZLW/00lXcnh1RGvqCDklEMD6sJ/dspdW+7umxqWeTVcNgUFLBM6+oBmav+aBY/BN9k/nn8lCvIup915PvLWnzZe/4x4bNYZoLP7Y6x8e4ZlvzObWklHc8fjmuFoQjmF66qVD+c2WeA+ncDh50Jx/HF7N6Nlt+wh5XGodzgf9nYhrl+z6bWlP/udcNLAgwVbieJa9v/8EdzwePyMOmi0DbQbxOfYbb1/bqv2dTjrz3fZqbel4d+WcQCgdW8R91/SnloszOhtQOkc63YOTZUxtq8pb0DW89RZuvHIEM0ZfkNBXv+bhx3FbdTyHHn19NxX1xzj2SQtw3hXTn9HVubbjPuq9xfRRQ5l62VCe2bI35SzU37/WqEFsl9q28LZry9UzSHvyP+egZ9SWC23QbBloM4jPub73Wv77ZmrVoDPfbeecZ17dytIbZ6oNoTuYWBRm+dzEfDFKz6QtQ2BXvEaSzdC8s3rnJZPs2t5Mrvlh4VvXX57gbSRYRXy8M2Kw7BP+4Djn3P/86zJ3BuwNIHOWt/xGbYAPPj5FSKwZdUGeVRlu0weHERFCWJlmDxw/Q0V9JKGPR0+dC7RTODjaSwzi2ghWvkLhvFbkXSJy3Gu9EeJe7QnOZ4z1a2cFeSFWXHe5lT6kJYaIxAUkFg0sICRCzBhEhFNnWjh5rjXOndcfxBey16u8z7NoYEGbtb+9dNYI3BHX3VTnlY4t4tTlBWkRWDkpEJS+QVcjT9uaoXXo2gGZXP3LEAV5IR5YPJWqAyc4eupcu9bfvf0rGljQZsGaivoIqzZUEzXWi/vOa8fxwEtVcfEJBnhmy163cA+QYEC/ZlwRW+siWCF3Fp+fcSmTRhS6L0nHpXZbfYSYAWOsWIuVC4uBRPfZkEAoJMRixm2XbMkumXa28sUqYsawakM1k217wqoN1a521hozPPpGrSu4vnzNGPf8McMH8ezWvew4eJJWOwX7ndeOi3uezmfTllbYFSNwd+R8ysRKhgoEpdfSHZGn7XWRbGupJSiTa9AyRKSpOTCTaao+7z9+hperP06apbSiPsLDr35Ic6tleDDGUH3wZNz9YwZivuWSA8fPxGks0aihX344YZmo8ZNmHp43MU7jmTSikK11511qozHDY2/sZmBBmLMt5w0gMYOdcsS47Z7dupfqA5YNImjJzq+dRZqaiRkTN/bLLhjgjteLE/l96QUD3OfjlEx1jPGxmOH3vudZdeAEt9rBcS/YuZTacsP1fye8WpG37OuB42c69R3153d69PXdgUuR3Y0KBKXXks7I0/ZeO1m7ION0R/vn1zIcDOfz/UBiic+gkqBewmFrueSRVz9MuG7xyCG8vfso3nftgqkjU7rjAtQ1NqUck+G8S2xeWOKWd5LlQ1q5sDgh19EDi4rjXMgdgkqa+g3/MaC+sSmuCt5vtu1r0w0WUudv8n4GjnbkuAMny1OVDH9W2ld2HOK1nYfighHTgQoEpdeSToNze6+drF3p2KIOGachcc24LUO0NyuqY1gNAVcOD/GPX7JeZJMvKWTVb6vjEt8BXP+pi4g0Nce5dWKfXzggn2e/+T949PXdHD55lttnjmHZrDH8cP37CdqE4477x52H+PjkuYQ+DhuUT+STlqSG6daoYfqoIUy9bGjc8wmqETF38sW8bOdsao1a2pY3/5EAZeOK6J8fZsHUkQCufWBj1cGEsXpf3M54vC2aW2N8//ntzJownOJLh7rLSU4EeNHAAvf5b65tjHM79hrQU+WpSobjIu+Mz7meE1C76LIoc9t1pY6hAkHp1aQz8rS9107WriN9a48LrN8IHRRo9/mJBXFCaeWi4gQt4/UPj3D5hYPwviMFKMg/b+z9z78ui+vbc9v2xfXX64779KVDuX/9+wlj+lLpaJ58u84NbPO+gB3e33+CDw6dcu0pkDg7/s22fXhT7DjZbmdPGM66ygaaW2LkhYXtDSdojcbcjLReQ7Z3xk5ALqpwgMG85sgn1Bz5JK6/BXkhHlgUXyfjzmvHBQo9R1vrbK0VJ7+T8/wctjecoPoAXF2ikcqK0ifwrzkHrTUHucDCeSM0WAbe6yZd5BqpT+3ZnnCv28pGu8FlYGkX1QdPui9KAT496cKkaSleqGyI01Smjxoal/LFqdi2seogwwcV0PhJM8Ujh1A4IJ87rx1H9cGT7nbRwAKqDpygev8J3t9/InBt3T87DvJ8qjpwgkhTMysXFlNZtYt+w0aed6+NmjiHWWeMXrde/zN0PMGeeGuP+5yCaG610oI4dpKzLTFe3XWYkJAgYC+/aBAA//H6br7p8T5zSBYM593v5N/yfn4ArTHS4hqrAkFRMkxQsFayteZkgXVBXkzeWbb3Pk7NhQJPzQWn1oOjWSQTBv7194K8UGD+r2WzxriCIWh8/pQXfpda/9r6kpJRCVljHfJ8wXb3lhRwtSdbqgj47c0GyxbiFTpOP16obHCfUaKZOpH398cvwdUcPk04RJz6Ewrhahc1Rz5h0weHWbvi2rj7BgXDQaLnlxMgGPcMQqQloFYFgqJkmKBgrY6uNScLpiqW+DZt1VxIlsbBfx9v4N1tpamXP5IFo/m1gLZsNH4tIQRMswPtgLhgu13Hoiz3XO/A8TNxa++QvIZGnOdQihQizjOIBTS7aHA/Dp0852ojFw3uF2dXaYmahKC6oM/PaevgDfzzPoPxHNY4BEXpC/iTxjmeMR1Za07mxXRqT0NcG699wVtzAYK1D79hO9k1kqXLdpbBgsbnn9F6AwC9mWKd38WXDo2rgbFykRXn8ODGnTgmhXA4xJRh4bj+gLUM5PX6cewj/nGeOtOCiATWuggKwssPJ+4HGDNsIMeaWtxzxwwbGCcQwiHYvu84X3r0z5xrjXHthOFxXloi1vEJFw4iJLgR504VPieGwzHAn9qTnpK/KhAUJcP4A846UrfAe40gL6byPcH3cV6GnSkx6Z/JB7XzX9vrjdPW+Npy2fRex+n/7f/x57jloGgsRsOpGKt9/Vm5sJiVL1YR9QXDBd3TywOL4u/nrTMRDgkPLJ7K5EsK3eC8Y580U3+siW31EfJCwg1XjKD8wyP2tlXHe9igAir3HXe9pMAyDIc9Fe1jBve4YBe7t7U9Afe6TmDhvSUF6mWkKH2F7vCOas81vG3WbKo5X9+gjbxD/iUe/32C2kF8kJm/ZkQy/MtL/mUm73XWbKpJsA1EY7DtUGtCnYV9x5qI2fUhjLFqWDhagWPA9wsDb60Lp623zoQxxjVmO9rcmk01rP7DB67x+0xL1K23IcAXSkZx4PgZtniC+Lx9D8J4/jBYS0i1Rz9xvaacZbJ0oAJBUXKEooEF7vq347rppavBeJ0JEvTXKHEIWmay2sYbjPPDQtmIPGpOtroZYJ+vaHBfns51igYWxBnY88IhWlvj3Tm9uZj8bZ2lIH/m2KKBBXEBb8Ujh8QZ64MCAFPhzxtlIM7DyFkmSwcqEBQlR4g0NZ9fkiHRyNrVYLygpaVk1/Ie8weYJcsYWzq2yA2a23PkNBMuGsw3r7+cv1RWxtVZeGbLeUO042rqN7B/5oqLOdsSpXjkEE6ea41bdvNqUl5j/PZ9x3llx6G47KoHjp9x+xcSK7Bv5cJit/6CPwAwPywJxuubrhzBRYX9XNdXZ8nqhcqGBOO4Y9ifWKQ2BEVRusDsCcPjjLRBs/iuBON597WVnC0oNYW3X98K8Nn33sMfNPfTrWdpNXvjqtQFudN6q7W9/uERWqOxwApwyQzpj7z6YVwFN//sP8/e5wStba07Fpd2AyDmq2Hvz5DrxxuY5thVblWjsqIoXSWdqT78tJUIzn/MW1muo/3aXNtISwx31p7sWt6xHzh+ps0aEUHPybJfxLvfemf/3n3+scWloDCWRnD45FlGDOkfGLAW1A+/cd7rPNCdqEBQlBwiHak+gpaG2rJHBB3rbL9mTxhOfshy00x1La+bqxPE1l5NKZnWkGqf1w22LQ3IW5fCiToPMuinm4wIBBGZDzwChIHHjTEP+o73A/4PUAo0ArcbY+oy0TdFUTpPsqWhtrSR7tRUSscW8Xcz+3PugrEdrjrWmUplqewmHdnnEJTVNlNlPP2kXSCISBhYA9wENABbReQlY8wOT7O7gIgxZqKIfBn4CXB7uvumKErXaGtpqK3ZbXfOfCcWhZk7N7WLa1fvn8pu0tF9DkFZbZtb42teZIpQ6iZd5hqgxhhTa4xpBtYCt/ja3AL8b/vv54EbRDzlpxRF6ZE4SynhJNHISmqcqHM/z1c0UFGfGL+QTsT4rN7dfgOR24D5xpjl9vZXgFnGmLs9barsNg329m67zVHftVYAKwBGjBhRunbt2k716fTp0wwePLhT5/ZWdMy5QTbGXBOJsutYlCnDwkwsSo9/fFv0hc+5JhLlrf0tfBCJceAT650cApZMymfh5QUJ7bsy5nnz5lUYY8qCjvUqo7Ix5jHgMYCysjIzd+7cTl2nvLyczp7bW9Ex5wbZGHNm75ZIX/ic5wLLScwCu/TGmYHLRukacyYEwn5gtGd7lL0vqE2DiOQBQ7GMy4qiKDlDJl2Dg8iEQNgKTBKR8Vgv/i8Dy3xtXgK+CrwN3Ab80aR7LUtRFKUHkmlXUy9pFwjGmFYRuRv4A5bb6RPGmGoRWQVsM8a8BPwK+P9EpAY4hiU0FEVRlAySERuCMeZ3wO98+1Z6/j4LfDETfVEURVGCyYTbqaIoitILUIGgKIqiACoQFEVRFBsVCIqiKAqQgUjldCEiR4D6Tp5+IXA0Zau+hY45N9Ax5wZdGfNYY8xFQQd6rUDoCiKyLVnodl9Fx5wb6Jhzg3SNWZeMFEVRFEAFgqIoimKTqwLhsWx3IAvomHMDHXNukJYx56QNQVEURUkkVzUERVEUxYcKBEVRFAXIQYEgIvNF5AMRqRGR+7Ldn+5CRJ4QkcN29Tln3zAReUVEPrJ/F9n7RUT+1X4G74lISfZ63nlEZLSIbBKRHSJSLSJ/a+/vs+MWkf4iskVEtttj/kd7/3gRecce27MiUmDv72dv19jHx2V1AJ1ERMIi8hcR2WBv9+nxAohInYi8LyLvisg2e19av9s5JRBEJAysARYAVwJLReTK7Paq23gSmO/bdx/wmjFmEvCavQ3W+CfZPyuAf89QH7ubVuB/GmOuBGYD37E/z7487nPAZ4wx04EZwHwRmQ38BPi5MWYiEAHustvfBUTs/T+32/VG/hbY6dnu6+N1mGeMmeGJOUjvd9sYkzM/wLXAHzzbPwB+kO1+deP4xgFVnu0PgJH23yOBD+y//wNYGtSuN/8ALwI35cq4gYFAJTALK2o1z97vfs+x6pBca/+dZ7eTbPe9g+McZb/8PgNsAKQvj9cz7jrgQt++tH63c0pDAC4D9nm2G+x9fZURxpiD9t8fAyPsv/vcc7CXBq4G3qGPj9tePnkXOAy8AuwGjhtjWu0m3nG5Y7aPnwCGZ7TDXedh4O+AmL09nL49XgcDvCwiFSKywt6X1u92RgrkKNnHGGNEpE/6GIvIYGAd8F1jzEkRcY/1xXEbY6LADBG5AFgPTMluj9KHiCwEDhtjKkRkbpa7k2k+bYzZLyIXA6+IyC7vwXR8t3NNQ9gPjPZsj7L39VUOichIAPv3YXt/n3kOIpKPJQyeMsa8YO/u8+MGMMYcBzZhLZlcICLOBM87LnfM9vGhQGNme9ol5gCLRaQOWIu1bPQIfXe8LsaY/fbvw1iC/xrS/N3ONYGwFZhkeygUYNVufinLfUonLwFftf/+KtYau7P/r23PhNnACY8a2msQSxX4FbDTGPMzz6E+O24RucjWDBCRAVg2k51YguE2u5l/zM6zuA34o7EXmXsDxpgfGGNGGWPGYf2//tEYcwd9dLwOIjJIRAqdv4GbgSrS/d3OtuEkC4aavwI+xFp3/WG2+9ON43oGOAi0YK0f3oW1dvoa8BHwKjDMbitY3la7gfeBsmz3v5Nj/jTWOut7wLv2z1/15XEDVwF/scdcBay0908AtgA1wHNAP3t/f3u7xj4+Idtj6MLY5wIbcmG89vi22z/Vzrsq3d9tTV2hKIqiALm3ZKQoiqIkQQWCoiiKAqhAUBRFUWxUICiKoiiACgRFURTFRiOVlT6LiESxXPAc1hpjHsxWf7qCiDwAnDbGrM52X5S+iwoEpS9zxhgzI9udUJTegi4ZKTmFWPUwnvNsz/Xk2L9ZRN4WkUoRec7OkeTkpf9He//7IpKQO8hOOPeQiGy189F/03P9N0Tk/4pVh+NREQnZx5ba16sSkZ94rjXfvtd2EXnNc5srRaRcRGpF5P+12w6yr73dvs7taXlwSk6gAkHpywywi4s4P7djRXfOstMBANwOrBWRC4G/B240xpQA24B7PNc6au//d+DegHvdhZUuYCYwE/iGiIy3j10D/A1WDY7LgSUicilWrv7PYNU1mCkinxeRi4D/BG41Vs2DL3ruMQX4rH29H9l5nOYDB4wx040xU4Hfd/JZKYouGSl9msAlIxH5PbBIRJ4HPoeVWvl6rBf2W3a21ALgbc9pTuK8CmBJwL1uBq4SESe/zlCsYiXNwBZjTK1972ewUm60AOXGmCP2/qeA64Ao8IYxZg+AMeaY5x7/1xhzDjgnIoexUh+/D/yLrWFsMMa82c5noygJqEBQcpG1wN3AMWCbMeaUnSjvFWPM0iTnnLN/Rwn+vxHgb4wxf4jbaaVs9ueH6Wy+mHOev6NYBWI+tMsl/hXwv0TkNWPMqk5eX8lxdMlIyUVeB0qAb2AJB4DNwBwRmQju2vynOnDNPwDftpdxEJFPeZalrrEz7Iawlqj+hJV47XoRuVCs0q5L7X5tBq5zlptEZFhbN7WXnpqMMf8FPGSPS1E6hWoISl9mgFiVxRx+b4y5zxgTtQ3Jd2KnEjbGHBGRO4FnRKSf3f7vsTLjtofHsUqYVtraxhHg8/axrcAvgYlYaZvXG2NiInKfvS1Yy0EvAohVHesFW4AcxkpxnYxpwEMiEsNahvp2O/urKAlotlNFSSP2ktG9xpiFWe6KoqREl4wURVEUQDUERVEUxUY1BEVRFAVQgaAoiqLYqEBQFEVRABUIiqIoio0KBEVRFAWA/x9XwTJM8hGfbQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(np.mean(eta_quantum, axis=0)[::2], \".\", label=\"Fully quantum strategy\")\n", "plt.xlabel(\"Even epochs\")\n", "plt.ylabel(\"$\\eta$\")\n", "plt.legend()\n", "plt.grid()" ] }, { "cell_type": "markdown", "id": "fc7ac058", "metadata": {}, "source": [ "Here we see a different behavior. With Grover's amplification, getting a reward is more likely in the first epochs. However, as the probability gets updated, one of Grover's amplification feature will manifest itself: we start to \"overshoot\" or rotate too much and we get past the winning state, and once we got past it, it is not possible to recover the winning state. We converge to a state with zero probability of getting a reward and nothing will get updated. This is why we need to consider an hybrid strategy." ] }, { "cell_type": "markdown", "id": "eee6f816", "metadata": {}, "source": [ "#### Classical-quantum strategy" ] }, { "cell_type": "markdown", "id": "dfe8e73e", "metadata": {}, "source": [ "We want to start with a quantum strategy, and then switch to a classical strategy when e start to overshoot. This happens when the probability of winning in the quantum strategy gets lower than the classical one.\n", "\n", "Due to normalization (and the fact that the quantum strategy takes twice as many epochs than the classical one), this corresponds to solve the equation\n", "\n", "$$\\frac{1}{2}\\sin^2(3\\xi) = \\sin^2(\\xi)$$\n", "\n", "The solution can be found numerically and gives a value of $\\xi = 0.6811$ which corresponds to $\\varepsilon=\\sin^2(\\xi)=0.396$.\n", "\n", "We then choose $Q_L$ to be the value where we switch from quantum to classical and the only requirement is $Q_L<0.396$. To follow [1] we will choose, $Q_L = 0.37$." ] }, { "cell_type": "code", "execution_count": 24, "id": "90a4acc1", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "5ee715ffa984482a80cc31b8774e123b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "QL = 0.37\n", "eta_classical_quantum = []\n", "\n", "# Pourcentage bar\n", "f = FloatProgress(min=0, max=N_AGENTS)\n", "display(f)\n", "\n", "for agent in range(N_AGENTS):\n", " f.value = agent\n", " # Initialize initial scores\n", " h_0 = H_0\n", " h_1 = H_1\n", " eps = h_1 / (h_0 + h_1)\n", "\n", " # Initialize circuit with initial probability\n", " xi = np.arcsin(eps**0.5)\n", " \n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " \n", " theta2 = np.pi - 4*xi\n", " theta_ref.set_value(theta2)\n", " theta2_ref.set_value(-np.pi/2 - theta2/2)\n", "\n", " # Arrays of epsilon\n", " eps_array = []\n", " i = 0\n", " while i < N_EPOCH:\n", " if eps < QL:\n", " # Perform a quantum round\n", " if get_reward(quantum_circuit):\n", " h_1 = h_1 + 2\n", " eps = h_1 / (h_0 + h_1)\n", " xi = np.arcsin(eps**0.5)\n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " \n", " theta2 = np.pi - 4*xi\n", " theta_ref.set_value(theta2)\n", " theta2_ref.set_value(-np.pi/2 - theta2/2)\n", " eps_array.append(0.5)\n", " eps_array.append(0.5)\n", " else:\n", " eps_array.append(0)\n", " eps_array.append(0)\n", "\n", " # Update epoch by 2\n", " i = i + 2\n", " else:\n", " # Perform a classical round\n", " if get_reward(classical_circuit):\n", " h_1 = h_1 + 2\n", " eps = h_1 / (h_0 + h_1)\n", " xi = np.arcsin(eps**0.5)\n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", "\n", " eps_array.append(1)\n", " else:\n", " eps_array.append(0)\n", " # Update epoch by 1\n", " i = i + 1\n", "\n", " eta_classical_quantum.append(eps_array)\n", "\n", "eta_classical_quantum = np.array(eta_classical_quantum)\n", "f.value=N_AGENTS" ] }, { "cell_type": "markdown", "id": "20a92f86", "metadata": {}, "source": [ "#### Plots" ] }, { "cell_type": "code", "execution_count": 25, "id": "957d52f1", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(np.mean(eta_classical, axis=0)[::2], \".\", label=\"Fully classical strategy\")\n", "plt.plot(np.mean(eta_quantum, axis=0)[::2], \".\", label=\"Fully quantum strategy\")\n", "plt.plot(np.mean(eta_classical_quantum,axis=0,)[::2],\".\",label=\"Quantum-classical strategy\",)\n", "plt.xlabel(\"Even epochs\")\n", "plt.ylabel(\"$\\eta$\")\n", "plt.legend()\n", "plt.grid()" ] }, { "cell_type": "markdown", "id": "a4390ce7", "metadata": {}, "source": [ "## Conclusion" ] }, { "attachments": {}, "cell_type": "markdown", "id": "34dd02db", "metadata": {}, "source": [ "Simulating the circuits of [1], we are able to reproduce their results. Data are still noisier than the results due to a smaller number agents. A parallelized version of this code was executed with 10 000 agents and the following results were found:\n", "\n", "![results_10000.png](../_static/img/reinforcement-learning_results_10000.png)\n", "\n", "which are very close to the paper results.\n", "\n", "It's possible to play with the value of $Q_L$ and the number of agents. Remember that the simulation time is linear with the number of agents." ] }, { "cell_type": "markdown", "id": "911dd875", "metadata": {}, "source": [ "## Acknowledgement" ] }, { "cell_type": "markdown", "id": "7721eae9", "metadata": {}, "source": [ "This work was initially done during the Hackathon on Linear Optical Quantum Communication (LOQCathon) organised by [Quandela](https://www.quandela.com/) and [QICS](https://qics.sorbonne-universite.fr/en) (Quantum Information Center of Sorbonne Université), by the team composed of Luís Bugalho, Laura dos Santos Martins, Paolo Fittipaldi, Yoann Piétri and Verena Yacoub. The supervision was provided by Pierre-Emmanuel Emeriau." ] }, { "cell_type": "markdown", "id": "441c442e", "metadata": {}, "source": [ "## References\n", "\n", "> [1] V. Saggio, B. E. Asenbeck, A. Hamann, et al. Experimental quantum speed-up in reinforcement learning agents. [Nature](https://doi.org/10.1038/s41586-021-03242-7), 591(7849), 229-233 (2021).\n", "\n", " > [2] A. Hamann, S. Wölk. Performance analysis of a hybrid agent for quantum-accessible reinforcement learning. [New Journal of Physics](https://doi.org/10.1088/1367-2630/ac5b56 ), 24(3), 033044 (2022)." ] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 5 }